// 包声明语句，用于组织和管理Java类
// com.itheima.staticmethod是包的路径，表示该类位于staticmethod包下
package com.itheima.staticmethod;

// 定义了一个名为Test4的公共类
// public表示这个类可以被其他包中的类访问
public class Test4 {
    // 静态变量：属于类的变量，所有对象共享同一份数据
    // public：访问权限修饰符，表示可以在任何地方访问
    // static：表示这是一个静态变量，它属于类本身，而不是类的某个实例
    // int：变量的数据类型，表示整数
    // count = 100：变量名和初始值
    public static int count = 100;
    
    // 静态方法：属于类的方法，不需要创建对象就可以调用
    // public static：公共的静态方法
    // void：无返回值
    // printHelloWorld2()：方法名
    public static void printHelloWorld2(){
        // 输出"Hello World!"到控制台
        System.out.println("Hello World!");
    }
    
    // 实例变量：属于对象的变量，每个对象都有自己独立的一份数据
    // private：访问权限修饰符，表示只能在当前类中访问
    // String：变量的数据类型，表示字符串
    // name：变量名，用于存储对象的名称
    private String name;
    
    // 实例方法：属于对象的方法，需要创建对象才能调用
    // public：公共的实例方法
    // void：无返回值
    // run()：方法名
    public void run(){
        // 方法体为空
    }

    // main方法：Java程序的入口点
    // public static void main(String[] args) 是固定的入口方法格式
    public static void main(String[] args) {
        // 目标：搞清楚静态方法，实例方法访问的几点注意事项
        
        // 调用本类的静态方法printHelloWorld
        // 在同一类中调用静态方法，可以直接使用方法名，不需要通过类名
        printHelloWorld();
    }

    // 1、静态方法中可以直接访问静态成员，不可以直接访问实例成员
    // 这是因为静态方法属于类，而实例成员属于对象，调用静态方法时可能还没有创建对象
    public static void printHelloWorld(){
        // 正确：静态方法中可以访问静态变量
        System.out.println(count);
        
        // 正确：静态方法中可以访问静态方法
        printHelloWorld2();
        
        // 错误：静态方法中不能直接访问实例变量
        // 因为name是实例变量，只有创建了对象之后才会存在
        // System.out.println(name); // 报错
        
        // 错误：静态方法中不能直接访问实例方法
        // 因为run()是实例方法，需要通过对象来调用
        // run(); // 报错
        
        // 错误：静态方法中不能使用this关键字
        // this表示当前对象，但静态方法不属于某个具体对象
        // System.out.println(this); // 报错。this代表的只能是对象。
    }

    // 2、实例方法中既可以直接访问静态成员，也可以直接访问实例成员
    // 3、实例方法中可以出现this关键字，静态方法中不可以出现this关键字
    // 因为实例方法属于对象，调用实例方法时必然存在一个对象
    public void go(){
        // 正确：实例方法中可以访问静态变量
        System.out.println(count);
        
        // 正确：实例方法中可以访问静态方法
        printHelloWorld2();
        
        // 正确：实例方法中可以访问实例变量
        System.out.println(name);
        
        // 正确：实例方法中可以访问实例方法
        run();
        
        // 正确：实例方法中可以使用this关键字
        // this指向调用该方法的对象本身
        System.out.println(this);
    }


}
